#fuses XT,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP
#include "C:\Users\QxxxQ\Desktop\seq\programas pic\pruebas\main.h"
#zero_ram
#use delay(clock=40000)
//#use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_A1,RESTART_WDT,ERRORS,INVERT)
#use fast_io(A)
#BYTE TRISA = 0x85
#BYTE PORTA = 0x05

int8 i = 0;
int8 a;
int8 b;
int chan = 0;
int togg = 0;
int togg2=0,togg3=0,togg4=0;
  int16 da0,da1,da2,da3,da4,da5,da6,da7,da8;
 int16 bb;
 #DEFINE sa11 10
 #DEFINE sa22 40
 int8 saa1,saa2;
  int8 sa1,sa2; 
 int16 ra0,ra1,ra2,ra3,ra4,ra5,ra6,ra7,ra8;
#BYTE TRISB = 0x87
#BYTE PORTB = 0x07
#BYTE TRISD = 0x88
#BYTE PORTD = 0x08
/*void write_eeprom_16bits(int16 add, unsigned long value) {
    write_eeprom(add, (value));
    write_eeprom(add+1, ((value) >> 8));
}

int16 read_eeprom_16bits(int16 add) {
    int16 a1, a2, result;

    a1 = read_eeprom(add);
    a2 = read_eeprom(add+1);
    result = a1 | (a2 << 8);
    return result;
}*/

struct SN74HC165 
{ 
  int16 address; 
  int  seconds:2; 
  int  wieg:6; 
} ex_in; 

#IFNDEF EXP_OUT_ENABLE

#define EXP_OUT_ENABLE  PIN_C0
#define EXP_OUT_CLOCK   PIN_C1
#define EXP_OUT_DO      PIN_C2
#define NUMBER_OF_74595 2

#ENDIF


int16 write_expanded_outputs(int16 eo) {
  byte i;
  int16 ea;
  ea=eo;
  output_low(EXP_OUT_CLOCK);
  output_low(EXP_OUT_ENABLE);

  for(i=1;i<=NUMBER_OF_74595*8;++i) {  // Clock out bits from the eo array
    if((*(ea+(NUMBER_OF_74595-1))&0x80)==0)
      output_low(EXP_OUT_DO);
    else
      output_high(EXP_OUT_DO);
   shift_left(ea,NUMBER_OF_74595,0);
   output_high(EXP_OUT_CLOCK);
   output_low(EXP_OUT_CLOCK);
  }
  output_high(EXP_OUT_ENABLE);
  return (eo);
}

#IFNDEF EXP_IN_ENABLE

#define EXP_IN_ENABLE   PIN_C3
#define EXP_IN_CLOCK    PIN_C4
#define EXP_IN_DI       PIN_C5
#define NUMBER_OF_74165 2

#ENDIF


int16 read_expanded_inputs(int16 ei) {
  byte i;
  int16 ea;
  ea=ei;
  output_high(EXP_IN_CLOCK);
  output_low(EXP_IN_ENABLE);      // Latch all inputs
  output_high(EXP_IN_ENABLE);

  for(i=1;i<=NUMBER_OF_74165*8;++i) {      // Clock in bits to the ei structure
    shift_left(ea,NUMBER_OF_74165,input(EXP_IN_DI));
    output_low(EXP_IN_CLOCK);
    output_high(EXP_IN_CLOCK);
  }

  output_low(EXP_IN_ENABLE);
  return (ea);
}

void main(){
 
   bit_set(TRISA,0); //BO = 1 .. entrada
   bit_set(TRISA,2); //BO = 1 .. entrada
   bit_set(TRISA,3); //BO = 1 .. entrada
   bit_set(TRISA,4); //BO = 1 .. entrada
   output_B(0b0000000);
   output_D(0b0000000);
   chan=0;
   togg=0;
   
   while(1){
   if((input(PIN_A0)==1)&(togg==0)){
     switch (chan){
         case 0: 
            ra0=read_expanded_inputs(&da0);
            //bb=ra0;
       //     write_eeprom_16bits(ra0,0x54);
         //    bb=read_eeprom_16bits(ra0); 
           sa1=make8(ra0,0);
           sa2=make8(ra0,1);
            output_b(sa1);
           output_d(sa2); 
           write_program_eeprom (sa11, sa1);
           write_program_eeprom(sa22,sa2);
            
     /*       for(i=1;i<=NUMBER_OF_74595*8;++i) {  // Clock out bits from the eo array
                if((*(ra0+(NUMBER_OF_74595-1))&0x80)==0)
                output_low(EXP_OUT_DO);
                else
                     output_high(EXP_OUT_DO);
                   shift_left(ra0,NUMBER_OF_74595,0);
            }
            
            */
            togg=1;
            break;
      case 1:read_expanded_inputs(&da1);
            togg=1;
            break;
      case 2:read_expanded_inputs(&da2);
            togg=1;
            break;
         case 3:read_expanded_inputs(&da3);
            togg=1;
            break;
      case 4:read_expanded_inputs(&da4);
            togg=1;
            break;
       case 5:read_expanded_inputs(&da5);
            togg=1;
            break;
     case 6:read_expanded_inputs(&da6);
            togg=1;
            break;
      case 7:read_expanded_inputs(&da7);
            togg=1;
            break;
       case 8:read_expanded_inputs(&da8);
            togg=1;
            break;
   
   
   }
       }
     if(input(PIN_A0)==0){
      togg=0;
     }
     if(input(PIN_A2)==0){
      togg2=0;
     }
     if(input(PIN_A3)==0){
      togg3=0;
     }
     if(input(PIN_A4)==0){
      togg4=0;
     }
    if(input(PIN_A2)&&togg2==0){
   switch (chan){
      case 0://ra0=bb;
            //ra1=make16(sa2,sa1);
            saa1=read_program_eeprom(sa11);
            saa2=read_program_eeprom(sa22);
            bb=make16(saa2,saa1);
          
          
            write_expanded_outputs(bb);
            
            togg2=1;
            break;
      case 1:write_expanded_outputs(ra1);
            togg2=1;
            break;
       case 2:write_expanded_outputs(&da2);
            togg2=1;
            break;
      case 3:write_expanded_outputs(&da3);
            togg2=1;
            break;
      case 4:write_expanded_outputs(&da4);
            togg2=1;
            break;
       case 5:write_expanded_outputs(&da5);
            togg2=1;
            break;
     case 6:write_expanded_outputs(&da6);
            togg2=1;
            break;
      case 7:write_expanded_outputs(&da7);
            togg2=1;
            break;
       case 8:write_expanded_outputs(&da8);
            togg2=1;
            break;
           
      }
      
   }
 //  output_B(a);
   //output_D(b);
   if(input(PIN_A3)&&togg3==0){
      if(chan==7){
      chan=0;
      }
      chan++;
      togg3=1;
      }
   if(input(PIN_A4)&&togg4==0){
      if(chan==0){
      chan=7;
      }
      chan--;
      togg4=1;
   }
  
   }
   } 